/*
*
 * 饿汉模式
 * 单例模式类，用于确保一个类只有一个实例，并提供一个全局访问点
class Singleton{
    // 类的唯一实例，声明为private，防止外部直接访问
    private Singleton instance = new Singleton();

    */
/**
     * 获取Singleton类的唯一实例
     *
     * @return Singleton类的唯一实例
     *//*

    public Singleton getInstance() {
        return instance;
    }

    // 私有构造方法，防止外部实例化
    private Singleton(){}
}
*/
/**
 * 懒汉式单例模式实现（双重检查锁定版本）
 * 注意：当前代码存在线程安全问题，需进一步改进（见下方说明）
 */
class SingletonLazy {
    // 问题1：instance 字段未声明为 volatile，可能导致指令重排序问题
    private static SingletonLazy instance = null; // 静态实例变量

    // 问题2：锁对象应该使用静态final修饰，否则每个实例会有不同锁对象
    private static final Object locker = new Object(); // 同步锁对象

    /**
     * 获取单例实例（需改进的版本）
     * 问题3：getInstance() 方法未声明为静态，导致无法通过类名直接调用
     *
     * 实现逻辑：
     * 1. 第一次检查：避免不必要的同步
     * 2. 同步代码块：保证线程安全
     * 3. 第二次检查：防止重复创建实例
     */
    public static SingletonLazy getInstance() { // 应改为静态方法
        if (instance == null) {                 // 第一次检查（非线程安全）
            synchronized (locker) {             // 同步代码块
                if (instance == null) {         // 第二次检查（线程安全）
                    // 问题4：若未使用volatile，此处可能发生指令重排序
                    instance = new SingletonLazy();
                }
            }
        }
        return instance;
    }

    // 私有构造函数，防止外部实例化
    private SingletonLazy() {}
}

/*-------------------------------------
 * 改进建议（正确实现）：
 * 1. 添加 volatile 关键字修饰实例变量：
 *    private static volatile SingletonLazy instance = null;
 *
 * 2. 修改锁对象为静态final：
 *    private static final Object locker = new Object();
 *
 * 3. 将 getInstance() 改为静态方法
 *
 * 4. 完整正确实现：
class SingletonLazy {
    private static volatile SingletonLazy instance = null;
    private static final Object locker = new Object();

    public static SingletonLazy getInstance() {
        if (instance == null) {
            synchronized (locker) {
                if (instance == null) {
                    instance = new SingletonLazy();
                }
            }
        }
        return instance;
    }

    private SingletonLazy() {}
}



public class Test {

}
